package juego.tests;

import java.util.ArrayList;
import juego.modelo.MapaFactory;
import juego.modelo.Punto;
import junit.framework.TestCase;

public class MapaFactoryTest extends TestCase {
	
	private MapaFactory mapaFactory;
	
	// Se prueba que se crea correctamente el mapa.
	public void testMapaFactory() {
		try {
			MapaFactory mapa = new MapaFactory(1);
		} catch (IllegalArgumentException e) {
			fail();
		}
	}
	// Se prueba que no crea el mapa cuando recibe un argumento invalido.
	public void testMapaFactoryNoCreaMapa() {
		try {
			MapaFactory mapa = new MapaFactory(0);
			fail();	
		} catch (IllegalArgumentException e) {
			assertTrue(true);
		}
	}
	// se testea que se cuentas correctamente los puntos comunes.
	public void testGetPosicionPuntoComun() {
		// en el archivo mapa1.txt hay 243 puntos comunes.
		int cantidad=0;
		try{
			this.mapaFactory = new MapaFactory(1);
			Punto[][] puntosComunes =  this.mapaFactory.getPosicionPuntoComun();
			for ( int i=0 ; i<this.mapaFactory.getAncho() ; i++ ){
				for ( int j = 0 ; j < this.mapaFactory.getAltura() ; j++ ){
					if ( puntosComunes[i][j] != null )
							cantidad++;
				}
			}
			assertEquals( cantidad,243);
		}catch ( Exception ex ){
			fail();
		}
	}
	// se prueba que se obtiene correctamente la cantida de fantasmas.
	public void testGetCantidadFantasmasOK(){
		int cantidadFantasmas = 0;
		try{
			this.mapaFactory = new MapaFactory(1);
		}catch ( IllegalArgumentException ex ){
			fail();
		}
		cantidadFantasmas = this.mapaFactory.getCantidadFantasmas();
		assertEquals(cantidadFantasmas,4 );
	}

	// Se prueba que se obtiene la cantida correcta de Puntos de Poder.
	public void testCantidadPuntosDePoder() {
		ArrayList<Punto> puntosDePoder=null;
		int cantidad = 0;
		try{
			this.mapaFactory = new MapaFactory(1);
			puntosDePoder = this.mapaFactory.getPosicionPuntoDePoder();
			for ( int x = 0 ; x < puntosDePoder.size() ; x++ )
					cantidad++;
			assertEquals ( cantidad,4 );
		}catch ( IllegalArgumentException ex ){
			fail();
		}
	}
	// Se prueba que los Puntos de Poder se encuentran en la posicion correcta.
	public void testgetPosicionPuntoDePoderCorrecta() {
		try {
			this.mapaFactory = new MapaFactory(1);
			ArrayList<Punto> puntosDePoder = this.mapaFactory
					.getPosicionPuntoDePoder();
			Punto punto = puntosDePoder.get(0);
			assertEquals(punto.getPuntoX(), 1);
			assertEquals(punto.getPuntoY(), 5);

			punto = puntosDePoder.get(1);
			assertEquals(punto.getPuntoX(), 26);
			assertEquals(punto.getPuntoY(), 5);

			punto = puntosDePoder.get(2);
			assertEquals(punto.getPuntoX(), 1);
			assertEquals(punto.getPuntoY(), 23);

			punto = puntosDePoder.get(3);
			assertEquals(punto.getPuntoX(), 26);
			assertEquals(punto.getPuntoY(), 23);
		} catch (IllegalArgumentException ex) {
			fail();
		}
	}
	/** Se prueba que se obtiene correctamente la posicion de Bonus */
	public void testGetPosBonus() {
		Punto posicionBonus=null;
		try{
			this.mapaFactory = new MapaFactory(1);
			posicionBonus = this.mapaFactory.getPosBonus();
			assertEquals( posicionBonus.getPuntoX(),14 );
			assertEquals( posicionBonus.getPuntoY(),17 );
		}catch ( IllegalArgumentException ex ){
			fail();
		}
	}
	public void testGetBonus() {
		try{
			this.mapaFactory = new MapaFactory(1);
			assert( this.mapaFactory.getBonus() != null );
		}catch ( IllegalArgumentException ex ){
			fail();
		}
	}
	/** se Prueba que se obtienen bien la altura y el ancho del laberinto */
	public void testgetAlturaYAncho(){
		try{
			this.mapaFactory = new MapaFactory(1);
			assertEquals( this.mapaFactory.getAltura(),31);
			assertEquals( this.mapaFactory.getAncho(),28);
		}catch ( IllegalArgumentException ex ){
			fail();
		}
	}
}
